#include "type.h"
#include "const.h"
#include "protect.h"
#include "proto.h"
#include "proc.h"
#include "string.h"
#include "global.h"

public void cstart()
{
	// 以下这句是于渊老师原版代码里没有的，如果不加这句，可能会导致disp_str函数调用后，字符串出不来的情况。
	disp_pos = 0;
	DispChar = 'a';
	disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
	"--------------\"cstart\" begins ------\n");
	
	// mov eax, 0x00034804
	// movzx eax, word [eax]
	// movzx eax, ax
	// add eax, 1
	// mov edx, 0x00034806
	// mov edx, dword [edx]
	// sub esp, 4
	// push eax
	// push edx
	// push 0x00034820
	// call 0x00030eb0
	// add esp, 16
	// 将loader中的gdt拷贝到新的gdt中
	memcpy(&gdt, (void*)(*((u32 *) (&gdt_ptr[2]))),
		*((u16*) (&gdt_ptr[0])) + 1);

	// mov [ebp - 12], 0x00034804
	u16* p_gdt_limit = (u16*) (&gdt_ptr[0]);
	// mov [ebp - 16], 0x00034806
	u32* p_gdt_base = (u32*) (&gdt_ptr[2]);
	// mov eax, [ebp - 12]
	// mov [eax], 0x3ff
	*p_gdt_limit = GDT_SIZE * sizeof(Descriptor) - 1;
	// mov eax, [ebp - 16]
	// mov [eax], 0x00034820
	*p_gdt_base = (u32) &gdt;
	
	// mov [ebp - 20],  0x00034c20
	u16 * p_idt_limit = (u16*) (&idt_ptr[0]);
	// mov [ebp - 24], 0x00034c22
	u32 * p_idt_base = (u32*) (&idt_ptr[2]);
	// mov eax, [ebp - 20]
	// mov [eax], 0x7ff
	*p_idt_limit = IDT_SIZE * sizeof(Gate) - 1;
	// mov eax, [ebp - 24]
	// mov [eax], 0x00034c40
	*p_idt_base = (u32) &idt;
	
	// call 0x000307e0
	init_prot();	
	
	disp_str("-----\"cstart\" ends-----\n");
}